// 此vm参数为页面的实例，可以通过它引用vuex中的变量
import md5 from 'js-md5'
import { env } from '@/config.js';

function setSorted(jsonObj) {
	const sortedObj = jsonObj;
	const arr = Object.keys(sortedObj)
		.filter((item) => item !== 'sign')
		.sort();
	const str = arr
		.map((item) => {
			if (typeof sortedObj[item] == 'object') {
				sortedObj[item] = JSON.stringify(sortedObj[item]);
			}
			if (sortedObj[item] !== undefined && sortedObj[item] !== null && sortedObj[item] !== '') {
				// return `${item}=${encodeURIComponent(sortedObj[item])}&`
				return `${item}=${sortedObj[item]}&`;
			}
			return '';
		})
		.join('');
	return str.substr(0, str.length - 1);
}
//深拷贝
function deepClone2(obj) {
	let _obj = JSON.stringify(obj);
	return JSON.parse(_obj);
}

module.exports = (vm) => {
	// 初始化请求配置
	uni.$u.http.setConfig((config) => {
		/* config 为默认全局配置*/
		// config.baseURL = 'http://47.98.50.65:9090'; /* 根域名 */
		config.baseURL = env.baseURL; /* 根域名 */
		// config.baseURL = 'https://cloudcheck.chintanneng.com:8443'; /* 根域名 */
		return config
	})

	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
		// 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
		let data = {}
		if (config.data) {
			data.body = {
				...config.data
			}
		}
		let token = uni.getStorageSync('token') ? uni.getStorageSync("token") : '';
		data.token = token;
		data.timestamp = config.header.timestamp = new Date().getTime();
		data = deepClone2(data)

		let array = setSorted(data)
		let slat = "IqUCTp3CmbRUPD";
		config.header.token = token;
		config.header.sign = md5(array + slat);
		if (config.custom.showToast !== false) {
			uni.showLoading({
				title: '加载中',
				mask: true
			});
		}
		return config
	}, config => { // 可使用async await 做异步操作
		if (config.showToast !== false) {
			uni.hideLoading();
		}
		return Promise.reject(config)
	})

	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => {
		/* 对响应成功做点什么 可使用async await 做异步操作*/
		if (response.config.custom.showToast !== false) {
			uni.hideLoading()
		}
		const data = response.data
		if (response.statusCode === 200 && response.tempFilePath) {
			return response.tempFilePath;
		}
		if (data.status == 1 || data.code === 200) {
			return response.data
		} else if (data.responCode === '10000') {
			return {
				...response.data,
				data: response.data.item
			}
		} else if (data.msg?.includes('token')) {
			setTimeout(function () {
				// 退出登录，清除token
				let isReadPrivate = uni.getStorageSync('isReadPrivate');
				let fontChange = uni.getStorageSync('fontsizeChange');
				let savedPhoneNumbers = uni.getStorageSync('savedPhoneNumbers')
				let apiEnv = uni.getStorageSync('apiEnv');
				uni.clearStorageSync();
				if (apiEnv) {
					uni.setStorageSync('apiEnv', apiEnv);
				}
				if (isReadPrivate) {
					uni.setStorageSync('isReadPrivate', isReadPrivate)
				}
				if (fontChange) {
					uni.setStorageSync('fontsizeChange', fontChange)
				}
				if (savedPhoneNumbers && Array.isArray(savedPhoneNumbers) && savedPhoneNumbers.length) {
					uni.setStorageSync('savedPhoneNumbers', savedPhoneNumbers)
				}
				uni.reLaunch({
					url: '/pages/login/login'
				})
			}, 1500)
		} else {
			uni.showToast({
				title: data.msg,
				icon: 'none',
				mask: true
			});
			return Promise.reject('服务器出错')
		}

	}, (response) => {
		uni.hideLoading()
		// 对响应错误做点什么 （statusCode !== 200）
		return Promise.reject(response)
	})
}
